package com.grid.camera.examples;

import com.grid.camera.pelco.PelcoDProtocol;
import com.grid.camera.pelco.PelcoDTcpClient;
import com.grid.camera.pelco.PelcoDUtils;

import java.io.IOException;

/**
 * Pelco D协议基本示例类 演示如何使用PelcoDProtocol和PelcoDTcpClient进行基本操作
 *
 * <p>此示例展示了如何使用PelcoDProtocol生成Pelco D协议命令， 并通过PelcoDTcpClient发送这些命令到摄像机。示例包括：
 *
 * <ul>
 *   <li>创建Pelco D协议对象和TCP客户端
 *   <li>连接到摄像机
 *   <li>发送上移、下移和停止命令
 *   <li>设置和调用预置位
 *   <li>处理响应数据
 * </ul>
 *
 * <p>运行此示例前，请确保：
 *
 * <ol>
 *   <li>已正确配置摄像机的IP地址和端口
 *   <li>摄像机支持Pelco D协议
 *   <li>网络连接正常
 * </ol>
 *
 * @author Grid Team
 * @version 1.0.0
 * @since 1.0.0
 */
public class PelcoDExample {

    public static void main(String[] args) {
        // 设备地址
        int deviceAddress = 1;

        // 创建TCP客户端
        PelcoDTcpClient client = new PelcoDTcpClient("192.168.15.184", 4196, deviceAddress);

        try {
            // 连接到摄像机
            System.out.println("正在连接到摄像机...");
            if (client.connect()) {
                System.out.println("连接成功");

                // 发送上移命令
                System.out.println("发送上移命令...");
                byte[] moveUpCmd = PelcoDProtocol.moveUp(deviceAddress);
                byte[] data = PelcoDProtocol.readHardwareVersion(1);
                if (client.sendCommand(data)) {
                    System.out.println("上移命令发送成功");

                    // 等待响应
                    byte[] response = client.receiveData();
                    if (response != null) {
                        System.out.println("上移命令响应: " + PelcoDUtils.bytesToHex(response));
                    } else {
                        System.out.println("未收到响应");
                    }
                }

                // 等待2秒
                Thread.sleep(2000);

                // 发送下移命令
                System.out.println("发送下移命令...");
                byte[] moveDownCmd = PelcoDProtocol.moveDown(deviceAddress);
                if (client.sendCommand(moveDownCmd)) {
                    System.out.println("下移命令发送成功");

                    // 等待响应
                    byte[] response = client.receiveData();
                    if (response != null) {
                        System.out.println("下移命令响应: " + PelcoDUtils.bytesToHex(response));
                    } else {
                        System.out.println("未收到响应");
                    }
                }

                // 等待2秒
                Thread.sleep(2000);

                // 发送停止命令
                System.out.println("发送停止命令...");
                if (client.stopMovement()) {
                    System.out.println("停止命令发送成功");

                    // 等待响应
                    byte[] response = client.receiveData();
                    if (response != null) {
                        System.out.println("停止命令响应: " + PelcoDUtils.bytesToHex(response));
                    } else {
                        System.out.println("未收到响应");
                    }
                }

                // 设置预置位
                System.out.println("设置预置位1...");
                if (client.setPreset(1)) {
                    System.out.println("设置预置位命令发送成功");

                    // 等待响应
                    byte[] response = client.receiveData();
                    if (response != null) {
                        System.out.println("设置预置位命令响应: " + PelcoDUtils.bytesToHex(response));
                    } else {
                        System.out.println("未收到响应");
                    }
                }

                // 等待1秒
                Thread.sleep(1000);

                // 调用预置位
                System.out.println("调用预置位1...");
                if (client.gotoPreset(1)) {
                    System.out.println("调用预置位命令发送成功");

                    // 等待响应
                    byte[] response = client.receiveData();
                    if (response != null) {
                        System.out.println("调用预置位命令响应: " + PelcoDUtils.bytesToHex(response));
                    } else {
                        System.out.println("未收到响应");
                    }
                }

                // 使用sendCommandAndWaitResponse方法
                System.out.println("使用sendCommandAndWaitResponse方法发送命令...");
                byte[] command = PelcoDProtocol.readStatus(deviceAddress);
                byte[] response = client.sendCommandAndWaitResponse(command);
                if (response != null) {
                    System.out.println("收到响应: " + PelcoDUtils.bytesToHex(response));
                } else {
                    System.out.println("未收到响应");
                }
            } else {
                System.out.println("连接失败");
            }
        } catch (IOException e) {
            System.err.println("通信错误: " + e.getMessage());
            e.printStackTrace();
        } catch (InterruptedException e) {
            System.err.println("线程中断: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 关闭连接
            System.out.println("关闭连接...");
            client.close();
        }
    }
}
